#include <iostream>

using namespace std;
// 345 反转字符串中的元音字母
// 给定一个字符串，将该字符串中的元音字母翻转
//- 元音字母包括 'a'、'e'、'i'、'o'、'u'，且可能以大小写两种形式出现不止一次。
//- 如，给出“hello”，返回“holle”
//- 如，给出“leetcode”，返回“leotcede”
// https://leetcode.cn/problems/reverse-vowels-of-a-string/description/

class Solution {
public:
    string reverseVowels(string s) {
        int i = nextVowerlsIndex(s, 0);
        int j = prevVowerlsIndex(s, s.size() - 1);
        while(i < j) {
            swap(s[i], s[j]);
            i = nextVowerlsIndex(s, i+1);
            j = prevVowerlsIndex(s, j - 1);
        }
        return s;
    }

private:
    // 从index开始从前往后找，找到第一个元音字母，返回索引。找不到则返回最后位置的下一个。
    int nextVowerlsIndex(const string& s, int index) {
        for(int i = index; i < s.size(); i++)
            if(isVowel(s[i]))
                return i;
        return s.size();
    }
    // 从index开始从后往前找，找到第一个元音字母，返回索引。找不到则返回最后位置的 -1。
    int prevVowerlsIndex(const string& s, int index) {
        for(int i = index; i >= 0; i--)
            if(isVowel(s[i]))
                return i;
        return -1;
    }
    // 判断是否是元音字母
    bool isVowel(char c) {
        char lowerc = tolower(c);
        return lowerc == 'a' || lowerc == 'e' || lowerc == 'i' || lowerc == 'o' || lowerc == 'u';
    }
};

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}
